<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0051)http://www.08hc.com/4rum/viewtopic.php?f=76&p=35927 -->
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="vi" xml:lang="vi"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta http-equiv="content-language" content="vi">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="imagetoolbar" content="no">

<title>08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing</title>



<link rel="stylesheet" href="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/stylesheet.css" type="text/css">
<script type="text/javascript">
// <![CDATA[

	var onload_functions = new Array();
	var onunload_functions = new Array();
	var ca_main_width = '100%';



function popup(url, width, height, name)
{
	if (!name)
	{
		name = '_popup';
	}

	window.open(url.replace(/&amp;/g, '&'), name, 'height=' + height + ',resizable=yes,scrollbars=yes,width=' + width);
	return false;
}

function jumpto()
{
	var page = prompt('Nhập số trang bạn muốn chuyển đến:', '1');
	var per_page = '';
	var base_url = '';

	if (page !== null && !isNaN(page) && page == Math.floor(page) && page > 0)
	{
		if (base_url.indexOf('?') == -1)
		{
			document.location.href = base_url + '?start=' + ((page - 1) * per_page);
		}
		else
		{
			document.location.href = base_url.replace(/&amp;/g, '&') + '&start=' + ((page - 1) * per_page);
		}
	}
}

/**
* Find a member
*/
function find_username(url)
{
	popup(url, 760, 570, '_usersearch');
	return false;
}

/**
* Mark/unmark checklist
* id = ID of parent container, name = name prefix, state = state [true/false]
*/
function marklist(id, name, state)
{
	var parent = document.getElementById(id);
	if (!parent)
	{
		eval('parent = document.' + id);
	}

	if (!parent)
	{
		return;
	}

	var rb = parent.getElementsByTagName('input');
	
	for (var r = 0; r < rb.length; r++)
	{
		if (rb[r].name.substr(0, name.length) == name)
		{
			rb[r].checked = state;
		}
	}
}



	/**
	* New function for handling multiple calls to window.onload and window.unload by pentapenguin
	*/
	window.onload = function()
	{
		for (var i = 0; i < onload_functions.length; i++)
		{
			eval(onload_functions[i]);
		}
	}

	window.onunload = function()
	{
		for (var i = 0; i < onunload_functions.length; i++)
		{
			eval(onunload_functions[i]);
		}
	}


if(navigator.userAgent && navigator.userAgent.indexOf('Mac OS X') > 0)
{
	document.write('<link rel="stylesheet" href="./styles/hestia_blue/theme/mac.css" type="text/css" />');
}

// ]]>
</script>
<script type="text/javascript" src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/ca_scripts.js"></script>
<script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/document_iterator.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/find_proxy.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/get_html_text.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/global_constants.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/name_injection_builder.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/number_injection_builder.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/string_finder.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/change_sink.js"></script><meta name="document_iterator.js"><meta name="find_proxy.js"><meta name="get_html_text.js"><meta name="global_constants.js"><meta name="name_injection_builder.js"><meta name="number_injection_builder.js"><meta name="string_finder.js"><meta name="change_sink.js"></head>
<body class="ltr">

<a name="top"></a>

<div id="logo-row">
    <div id="logo-left">
        <div id="logo-right">
            
                    <div id="logo-login">
                        <form method="post" action="http://www.08hc.com/4rum/ucp.php?mode=login&sid=35e863f12de61c3900a72eee590ee439">
                            <input class="post" type="text" name="username" size="7" title="Tên thành viên"> <input class="post" type="password" name="password" size="7" title="Mật khẩu"><br>
                            <input type="checkbox" class="radio" name="autologin" title="Đăng nhập tự động mỗi lần ghé thăm">&nbsp; <input type="submit" class="btnmain" name="login" value="Đăng nhập">
                        	
                        </form>
                    </div>
                    
            <a href="http://www.08hc.com/4rum/index.php?sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/logo_img.png" alt="" title=""></a>
            <div id="logo-clear"></div>
        </div>
    </div>
</div>
<div class="navrow">
    <a href="http://www.08hc.com/4rum/ucp.php?mode=register&sid=35e863f12de61c3900a72eee590ee439">Đăng ký</a> • 
    <a href="http://www.08hc.com/4rum/faq.php?sid=35e863f12de61c3900a72eee590ee439">Trợ giúp</a>
    <a href="http://www.08hc.com/4rum/chat.php?sid=35e863f12de61c3900a72eee590ee439">Chat</a>
     • <a href="http://www.08hc.com/4rum/search.php?sid=35e863f12de61c3900a72eee590ee439">Tìm kiếm</a> • <a href="http://www.08hc.com/4rum/ucp.php?mode=login&sid=35e863f12de61c3900a72eee590ee439">Đăng nhập</a>
</div>
<div id="content">
<table border="0" cellspacing="0" cellpadding="0" width="100%" id="maintable" align="center">
<tbody><tr>
	<td id="contentrow">


	<p class="searchbar">
		<span style="float: left;"><a href="http://www.08hc.com/4rum/search.php?search_id=unanswered&sid=35e863f12de61c3900a72eee590ee439">Bài viết chưa được trả lời</a> | <a href="http://www.08hc.com/4rum/search.php?search_id=active_topics&sid=35e863f12de61c3900a72eee590ee439">Chủ đề sôi nổi</a></span>
		
		<span style="float: right;">Hôm nay, T.Năm Tháng 7 21, 2011 5:42 pm</span>
		
	</p>
	

	<br style="clear: both;">
<br>

	<table class="tablebg breadcrumb" width="100%" cellspacing="0" cellpadding="0" style="margin-top: 5px;">
	<tbody><tr>
		<td class="row1">
			<p class="breadcrumbs"><a href="http://www.08hc.com/4rum/index.php?sid=35e863f12de61c3900a72eee590ee439">Trang chủ</a> » <a href="http://www.08hc.com/4rum/viewforum.php?f=6&sid=35e863f12de61c3900a72eee590ee439">Góc Học Tập</a> » <a href="http://www.08hc.com/4rum/viewforum.php?f=109&sid=35e863f12de61c3900a72eee590ee439">Chuyên Đề Java</a></p>
			<p class="datetime">Múi giờ UTC + 7 Giờ </p>
		</td>
	</tr>
	</tbody></table>

	<br>
<br>
<center>
<a href="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/image2.jpg" target="blank" title="Vietnam People&#39;s willing to sacrifice to protect the sea, sky and country"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/image2.jpg" width="300"></a>

<script type="text/javascript">
var xmlHttp = http_object();
var submit_type = 'none';
var g_post_id=0;
var g_poster_id=0;
var thanker_id=0;

function thankspost(url,post_id,poster_id,thanker)
{
	xmlHttp = http_object();
	thanker_id=thanker;
	g_poster_id=poster_id;
	g_post_id=post_id
	param='ajax=true';
	xmlHttp.onreadystatechange = thanks_return;
	xmlHttp.open("POST", url, true);
	xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xmlHttp.send(param);
}
function thanks_return()
{
	if (xmlHttp.readyState == 4)
	{
		document.getElementById('thanksimg'+g_post_id).style.display='none';
		document.getElementById('thanks_table_' + g_post_id).innerHTML = xmlHttp.responseText;
		var divtag = document.getElementsByTagName('div');
		i=0;
		l1=g_poster_id+"";
		l2=thanker_id+"";
		for(i=0;i<divtag.length;i++){
			curtag=divtag[i].id;
			if(curtag.substr(0,8+l1.length) == 'profile_'+g_poster_id) document.getElementById(curtag).innerHTML=document.getElementById('rewrprf'+g_post_id).innerHTML;
			if(curtag.substr(0,8+l2.length) == 'profile_'+thanker_id) document.getElementById(curtag).innerHTML=document.getElementById('rewrprf'+g_post_id+'_'+thanker_id).innerHTML;
		}
	}
}
//Comment function block if it alredy exist
function http_object()
{
	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
			xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch (e)
		{
			try
			{
				xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch (e)
			{
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}
	return xmlHttp;
}
</script>


<div id="pageheader">
	<h2><a class="titles" href="http://www.08hc.com/4rum/viewtopic.php?f=109&t=2372&start=0&sid=35e863f12de61c3900a72eee590ee439">[Swing] - Xây dựng giao diện bằng Swing</a></h2>


</div>

<br clear="all"><br>

<div id="pagecontent">

	<table width="100%" cellspacing="1">
	<tbody><tr>
		
			<td align="left" valign="middle" nowrap="nowrap">
				<a href="http://www.08hc.com/4rum/posting.php?mode=reply&f=109&t=2372&sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/button_topic_reply.gif" height="22" alt="Gửi bài trả lời" title="Gửi bài trả lời"></a>
			</td>
		
			<td class="nav" valign="middle" nowrap="nowrap">&nbsp;Trang <strong>1</strong> trên <strong>1</strong><br></td>
			<td class="gensmall" nowrap="nowrap">&nbsp;[ 4 bài viết ]&nbsp;</td>
			<td class="gensmall" width="100%" align="right" nowrap="nowrap"></td>
		
	</tr>
	</tbody></table>

			<table width="100%" cellspacing="0">
			<tbody><tr>
				<td class="nav" nowrap="nowrap">
				<a href="http://www.08hc.com/4rum/viewtopic.php?f=109&t=2372&start=0&sid=35e863f12de61c3900a72eee590ee439&view=print" title="Xem bản in">Xem bản in</a>
				</td>
				<td class="nav" align="right" nowrap="nowrap"><a href="http://www.08hc.com/4rum/viewtopic.php?f=109&t=2372&view=previous&sid=35e863f12de61c3900a72eee590ee439">Chủ đề trước</a> | <a href="http://www.08hc.com/4rum/viewtopic.php?f=109&t=2372&view=next&sid=35e863f12de61c3900a72eee590ee439">Chủ đề kế tiếp</a>&nbsp;</td>
			</tr>
			</tbody></table>

	<div class="block-start">
	<div class="cap-div"><div class="cap-left"><div class="cap-right">[Swing] - Xây dựng giao diện bằng Swing&nbsp;</div></div></div>
	<table class="tablebg" width="100%" cellspacing="0">
        
        <tbody><tr>
            <th>Người gửi</th>
            <th width="100%">Nội dung</th>
        </tr>
        <tr class="row1">

			<td align="center" valign="top" class="row">
				<a name="p35926"></a>
				<div class="postauthor" style="color: #2981B4">bangchu</div>
				<div class="postavatar"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/file.php" width="140" height="150" alt="Hình đại diện của thành viên"></div>

				<div class="postdetails">
					<br><b>Ngày tham gia:</b> T.Hai Tháng 7 13, 2009 7:11 pm<br><b>Bài viết:</b> 78<br><strong>Thanks:</strong>0 lần
					<br><b>Thanked:</b> 17 lần trong 14 posts
					
				</div>
				<img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" width="120" height="1" alt="">
			</td>
			<td width="100%" height="25" class="row" valign="top">
				<div style="float: right;"><a style="text-decoration:none;" id="thanksimg35926" href="http://www.08hc.com/4rum/thanks.php?p=35926&mode=thanks&sid=35e863f12de61c3900a72eee590ee439" onclick="thankspost(&#39;./thanks.php?p=35926&amp;mode=thanks&amp;sid=35e863f12de61c3900a72eee590ee439&#39;,35926,563,1); return false;"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/thankposts.gif" alt="Thanks">&nbsp;&nbsp;</a></div>
				<div class="postsubject"><a href="http://www.08hc.com/4rum/viewtopic.php?p=35926&sid=35e863f12de61c3900a72eee590ee439#p35926"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_topic_latest.gif" width="13" height="9" alt="Gửi bài" title="Gửi bài"></a>&nbsp;[Swing] - Xây dựng giao diện bằng Swing</div>

					

						<div class="postbody">1. Tại sao chọn Java làm Desktop app?<br>2. Qua bài viết này bạn có thể làm được những gì?<br>3. Giới thiệu sơ lượt các swing components<br>4. Tìm hiểu Layout<br>5. Tìm hiểu về Event<br>6. Splash screen<br>7. Xây dựng ví dụ mẫu<br>8. Look and Feel<br>9. Jar deploy<br>10. Deploy with Setup application<br>11. Deploy ứng dụng desktop thông qua web (Java Web start)<br>12. FAQ<br><br><br>Môi trường làm demo:<br>- Java: 1.6 beta 2<br>- IDE: Eclipse 3.1<br>- OS: Fedora Core 5/Windows XP SP2<br><br>Đối tượng mà bài viết hướng đến:<br>Tôi thấy các bài viết khác hướng đến những vấn đề cao cấp (Advanced) trong Java Desktop mà bỏ đi những phần căn bản, biết đâu những phần căn bản này lại góp phần xây dựng nên những vấn đề khác cao cấp hơn nữa!<br>Chính vì vậy, tôi viết bài này chỉ dành cho các bạn newbie hoặc những ai đã từng làm việc với J2EE, J2ME muốn tìm hiểu thêm J2SE (những phải biết những khái niệm cơ bản về GUI, chẳng hạn như biết thế nào là 1 TextField (TextBox)!) và cuối cùng là dành cho những ai muốn đọc bài này.<br><br>1. Tại sao chọn Java làm Desktop app?<br>- Ứng dụng Desktop viết bằng Java có những đặc điểm sau:<br>+ Cực kỳ ổn định, không bị lỗi tắt ngang giữa chừng như ứng dụng viết bằng .NET, VB, Delphi<br>+ Giao diện đẹp (không hè thua kém anh bạn .NET, nhiều khi còn trội hơn nữa là khác)<br>+ Giao diện không phụ thuộc độ phân giải màn hình (Thích hợp cho các LCD ngày càng rộng lớn)<br>+ Không phụ thuộc nền, CSDL (đáng giá ngàn vàng, nhất là khi gia nhập WTO)<br>+ Tốc độ thực thi hơi chậm, nhưng không đáng ngại lắm, hơi chậm tí thôi, có cách làm cho nó chạy nhanh hơn (Đón đọc tips: Tăng tốc load ứng dụng Swing)<br>+ Dễ bảo trì, nhất là GUI<br>+ Nhiều tools open source để lựa chọn<br>+ Report động bằng code Java (Không biết .NET có tools report nào như vậy không)<br>+ Một tính năng khác, có lẽ các bạn không tin! đó là "Hình như không bị nhiễm Virus" (Tình cờ phát hiện thôi)<br>+ Phát triển rất nhanh vì chúng ta có những framework hỗ trợ: NetBean Platform, Eclipse Platform và Spring Rich Client Platform, ...<br><br>- Tám 1 tí bây giờ vô vấn đề chính đây, mặc dù phần này có tiêu đề là "Xây dựng giao diện với Swing", nhưng tôi sẽ trình bày thêm những phần khác để các bạn có thể hình dung những bước phải làm để có 1 sản phẩm "tí hon".<br>- Không cần biết phần mềm của chúng ta sử dụng thuật giải cao siêu gì, thông minh đến đâu, nhưng 1 điều chắc chắn là nếu phát triển trên nền Command line (console), toàn 1 màu đen thui thì chỉ có mấy anh em họ *nix mới có thể sử dụng được, sở dĩ MS thành công như ngày nay không phải tại IBM và Apple ngu không đâu mà cũng nhờ 1 phần vào những phần mềm của họ có GUI thân thiện. Vì vậy GUI của phần mềm quan trọng như mấy em tiếp viên của quán café vậy!<br><br>--------------------------------------------------------------------------------------------------------------------<br>2. Qua bài viết này bạn có thể làm được những gì?<br>--------------------------------------------------------------------------------------------------------------------<br>- Nắm được những điểm mạnh/yếu của Java Desktop<br>- Hình dung được 1 cách tổng quan để lựa chọn những kỹ thuật thiết kế GUI trong Java.<br>- Biết được Swing hỗ trợ những components nào.<br>- Nắm vững khái niệm cực lợi hại "Layout" (ngày xưa tôi chọn Java cũng vì thằng này đây).<br>- Hình dung được cách xây dựng 1 phần mềm "bé xíu"<br>- Và phần cuối cùng là deploy ứng dụng tới end user<br><br>--------------------------------------------------------------------------------------------------------------------<br>3. Giới thiệu sơ lượt các swing components<br>--------------------------------------------------------------------------------------------------------------------<br>- Làm phần mềm cũng tương tự như xây 1 lâu đài tình ái (xây trên cát), xây nhà cần có KTS, Thợ, gạch, cát, ... thì làm phần mềm cũng cần phải có KST, LTV, ... và Components (những thành phần xây dựng nên GUI)<br>- Khi xây dựng GUI trên môi trường .NET, các bạn hình như chỉ có 1 sự lựa chọn duy nhất đó là sử dụng các Components có sẵn của VS.NET (hoặc sử dụng các components của nhà sản xuất thứ 3 - nhưng cũng kế thừa từ ... dòng họ MS).<br>- Đối với Java thì bạn có nhiều lựa chọn hơn, đôi khi cũng làm bạn đau đầu hơn, đó là:<br>+ AWT: Tiền bối của Java, bây giờ chỉ còn sử dụng cho applet<br>+ Swing: Thư viện này vô cùng mạnh mẽ và được được sử dụng nhiều nhất hiện nay<br>+ SWT: Thư viện này cũng khá mạnh mẽ nhưng lại của IBM (Eclipse sử dụng SWT để buid GUI), nên được sử dụng ít hơn Swing<br>+ Thinlet: Đây là thư viện nhỏ nhất trong tất cả các thư viện GUI (thư viện chỉ 36KB, không kế thừa từ Swing hay AWT, chạy rất nhanh, source code chỉ có 1 file duy nhất), components cũng hạn chế, thường được sử dụng cho applet nhưng viết bằng XML<br>+ Còn nhiều thư viện khác nữa, và người ta còn có xu hướng xây dựng GUI thông qua XML.<br><br>- Mỗi thư viện có 1 thế mạnh riêng, mình không có thời gian trình bày hết nên chỉ chọn Swing để trình bày vì nó mạnh mẽ, thông dụng nhất.<br>- Sau đây là danh sách những components chuẩn của Swing: Các Components trong Swing người ta thường chia ra làm 3 loại:<br>+ Window (cũng là 1 loại container)<br>+ Compoent<br>+ Container: dùng chứa components khác<br>Nhưng sự phân chia này chỉ mang tính tương đối, vì trong Swing, mọi Components đều có thể làm Container được!<br><br>Window:<br><br><br>* JWindow: Là 1 cửa sổ trụi lủi, không có title bar gì cả<br>* JFrame: Đây chính là cửa sổ chính<br>* JDialog: Hộp thoại<br>* JFileChooser: Hộp thoại chọn file<br>* JColorChooser: Hộp thoại chọn màu<br>* ...<br><br><br>Đoạn code sau minh họa cách sử dụng JFrame<br><br>public class MyFrame extends JFrame{<br>public MyFrame(){<br>super("JFrame demo";<br>setSize(800, 600);<br>setVisible(true);<br>}<br><br>public static void main(String args[]){<br>new MyFrame();<br>}<br>}<br><br>Online demo<br><br>Components:<br>Cái này quen quá nên khỏi giải thích<br><br><br>* JLabel<br>* JButton<br>* JCheckBox<br>* JRadio<br>* JTextField<br>* JTextArea<br>* JTextPane<br>* JEditorPane<br>* JComboBox<br>* JList<br>* JTree<br>* JTable<br>* JMenuItem<br>* JMenu<br>* ...<br><br><br>Containers:<br><br><br>* Container<br>* JPanel<br>* JScrollPane<br>* JSplitPane<br>* JMenuBar<br>* ...<br><br><br><br>- Còn đây là những components mở rộng (đón đọc phần 3 - customize Swing components):<br><br><br>* TreeComboBox<br>* CheckList<br>* CheckTree<br>* TaskPane<br>* PopupButton<br>* DatePicker<br>* ....<br>* Còn vô vàng những components khác, nhu cầu con người vốn dĩ đa dạng mà!<br><br><br>Đoạn code sau minh họa cách sử dụng 1 component nào đó, Ví dụ JTextPane<br>Sẵn đây minh họa luôn cách xem 1 trang web trong Java<br><br>import java.io.IOException;<br>import javax.swing.JFrame;<br>import javax.swing.JScrollPane;<br>import javax.swing.JTextPane;<br><br>public class JavaWebBrowser extends JFrame {<br>public JavaWebBrowser() {<br>super("Java Web Browser Demo";<br>setSize(800, 600);<br><br>JTextPane txtWebBrowser = new JTextPane();<br>txtWebBrowser.setEditable(false);<br>try {<br>txtWebBrowser.setPage("www.google.com");<br>} catch (IOException e) {<br>e.printStackTrace();<br>}<br><br>add(new JScrollPane(txtWebBrowser));<br>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br>setVisible(true);<br>}<br><br>public static void main(String args[]) {<br>new JavaWebBrowser();<br>}<br>}<br><br>--------------------------------------------------------------------------------------------------------------------<br>4. Tìm hiểu Layout<br>--------------------------------------------------------------------------------------------------------------------<br>- Việc thiết kế giao diện chỉ đơn giản là việc đặt các components lên Form ở những tọa độ thích hợp. Cách tiếp cận này có 1 nhược điểm khá lớn: tạo cho GUI cứng ngắt. Còn GUI của Java (Swing) tiếp cận theo hướng hoàn toàn khác, rất ấn tượng đó là "Layout". Vậy Layout là gì?<br>- Layout là cách bố trí các components trên Form theo 1 ràng buộc hay sự tương quan nào đó mà không hoàn toàn dựa vào tọa độ, nghe có vẻ khó hiểu quá! (từ từ thấm). Điều này làm cho giao diện thiết kế bằng Java rất mềm dẻo, không phụ thuộc vào độ phân giải màn hình là ở chỗ này đấy.<br>(Tạm thời bạn cứ chấp nhận khái niệm Layout đại khái như thế thôi, khi đọc xong hết phần này tự nhiên bạn sẽ hiểu)<br>- Trong AWT, Swing có rất nhiều Layout khác nhau, lựa chọn Layout nào là tùy thuộc vào từng ngữ cảnh cụ thế hoặc là ta có thể trộn nhiều layout lại với nhau. Sau đây là danh sách các layout:<br><br><br>* CardLayout: Như tên của loại layout này cũng nói lên được ý nghĩa của nó, khi ta đặt các components lên form có layout là CardLayout, thì cùng lúc ta chỉ thấy 1 components, giống như TabPane vậy! Hay đơn giản là các components chia sẻ nhau vùng hiển thị.<br>* BorderLayout: Loại layout này chia container ra làm 5 vùng: giữa (CENTER), trái (LINE_START), phải(LINE_END), trên(PAGE_START), dưới(PAGE_END). Vùng giữa giãn theo 2 chiều rộng và cao, vùng trái và phải chỉ giãn theo chiều cao, vùng trên và dưới chỉ giãn theo chiều ngang.<br>* BoxLayout: Đặt các components theo dòng hoặc cột, xếp liên tiêp nhau.<br>* FlowLayout: Tương tự BoxLayout, nhưng có thể nằm trên nhiều dòng và nhiều cột, khi đầy dòng/cột thì sang dòng/cột mới. kích thước các components có thể khác nhau.<br>* GridLayout: Layout này được tổ chức theo dạng lưới n dòng và m cột, mỗi component nằm trọn vẹn trong 1 cell. GridLayout chỉ thích hợp cho các ứng dụng có Layout giống như dò mìn hoặc caro.<br>* GridBagLayout: Đây là loại Layout mềm dẻo nhất (Bác sĩ khuyên dùng), nhưng cũng khó sử dụng nhất. Nó cũng dựa trên tư tưởng của GridLayout, nhưng cho phép 1 components chiếm (merge) nhiều ô (cell) của lưới, và sự co giãn của các cell cũng khác nhau.<br>* SpringLayout: Khi ta đặt components lên form có Layout là SpringLayout thì vị trí và kích thước của component sẽ được xác định dựa vào sự tương quan giữa compoent này với các components xung quanh nó<br>* null layout: không sử dụng Layout, quay về thời kỳ đồ đá giống GUI được thiết kế bằng VB, VC, Delphi, .NET,... đặt các components theo tọa độ cố định<br>* &lt;Your layout&gt;: và dĩ nhiên bạn cũng có thể chế tác thêm vài layout nữa<br><br><br>Mặc dù có nhiều loại Layout, nhưng ta chỉ cần sử dụng 4 loại là có thể xây dựng được tất cả các loại GUI phức tạp nhất. Đó là: GridBagLayout, BoxLayout, BorderLayout, CardLayout<br>Sau đây tôi sẽ trình bày cách sử dụng 4 loại layout này<br>Sử dụng BorderLayout<br><br>public class BorderLayoutDemo extends JFrame {<br>public BorderLayoutDemo() {<br>super("BorderLayout Demo";<br>setSize(800, 600);<br><br>buidGUI();<br><br>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br>setVisible(true);<br>}<br><br>private void buidGUI(){<br>setLayout(new BorderLayout());//set layout cho contentPane của Frame<br><br>JTable tbl = new JTable(10, 10);<br>tbl.setValueAt("CENTER", 9, 5);<br><br>//đặt các components vào từng vùng tương ứng<br>add(new JScrollPane(tbl), BorderLayout.CENTER);<br>add(new JButton("PAGE_START", BorderLayout.PAGE_START);<br>add(new JLabel("Status bar here...(PAGE_END)", BorderLayout.PAGE_END);<br>}<br><br>public static void main(String args[]) {<br>new BorderLayoutDemo();<br>}<br>}<br><br>Screenshot:<br><br>Online demo<br><br>Sử dụng CardLayout &amp; GridLayout<br>Sẵn đây trình bày cách sử dụng Menu luôn<br><br>public class CardLayoutDemo extends JFrame {<br>private JRadioButtonMenuItem itmSimple = new JRadioButtonMenuItem("Simple", true);<br>private JRadioButtonMenuItem itmComplex = new JRadioButtonMenuItem("Complex";<br>private CardLayout cardLayout = new CardLayout();<br><br>public CardLayoutDemo() {<br>super("CardLayout &amp; GridLayout Demo";<br>setSize(800, 600);<br><br>buidGUI();<br>registerListener();<br><br>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br>setVisible(true);<br>}<br><br>private void buidGUI(){<br>JMenuBar menuBar = new JMenuBar();<br>setJMenuBar(menuBar);<br>JMenu mnuLayout = new JMenu("Layout";<br>menuBar.add(mnuLayout);<br><br>ButtonGroup layoutGroup = new ButtonGroup();<br>layoutGroup.add(itmSimple);<br>layoutGroup.add(itmComplex);<br><br>mnuLayout.add(itmSimple);<br>mnuLayout.add(itmComplex);<br><br>JPanel pnlSimple = new JPanel();<br>pnlSimple.setLayout(new BorderLayout());<br>pnlSimple.add(new JTextField("Simple Form", BorderLayout.CENTER);<br>pnlSimple.setBackground(Color.GREEN);<br><br>JPanel pnlComplex = new JPanel();<br>pnlComplex.setLayout(new GridLayout(5, 5));<br>for(int i=0 ;i &lt; 5; i++)<br>for(int j=0; j &lt; 5; j++)<br>pnlComplex.add(new JButton(i + "x" + j));<br>pnlComplex.setBackground(Color.RED);<br><br>setLayout(cardLayout);<br>add("simple", pnlSimple);<br>add("complex", pnlComplex);<br>}<br><br>//tạm thời chưa quan tâm đến sự kiện<br>private void registerListener(){<br>itmSimple.addActionListener(new ActionListener(){<br>public void actionPerformed(ActionEvent e) {<br>cardLayout.show(getContentPane(), "simple";<br>}<br><br>});<br><br>itmComplex.addActionListener(new ActionListener(){<br>public void actionPerformed(ActionEvent e) {<br>cardLayout.show(getContentPane(), "complex";<br>}<br><br>});<br>} <br><br>public static void main(String args[]) {<br>new CardLayoutDemo();<br>}<br>}<br><br><br>Screenshot:<br><br>Online demo<br><br>Sử dụng GridBagLayout &amp; BoxLayout<br>Như trên có đề cập, GridBagLayout là layout mềm dẻo và phức tạp nhất. Nó xác định vị trí và kích thước components thông qua đối tượng thuộc lớp GridBagConstraints. Sau đây minh họa cách thiết kế form nhập hồ sơ nhân viên<br><br>public class GridBagLayoutDemo extends JFrame {<br>public GridBagLayoutDemo() {<br>super("GridBagLayout &amp; BoxLayout Demo";<br>setSize(800, 600);<br><br>buidGUI();<br><br>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br>setVisible(true);<br>}<br><br>private void buidGUI(){<br>JLabel lblID = new JLabel("Emp ID: ", JLabel.RIGHT);<br>JTextField txtID = new JTextField();<br><br>JLabel lblFullName = new JLabel("Full Name: ", JLabel.RIGHT);<br>JTextField txtFullName = new JTextField();<br><br>JLabel lblGender = new JLabel("Gender: ", JLabel.RIGHT);<br>JComboBox cbGender = new JComboBox(new String[]{"Male", "Female"});<br><br>JLabel lblAddr = new JLabel("Address: ", JLabel.RIGHT);<br>JTextField txtAdrr = new JTextField();<br><br>JButton btnFind = new JButton("Find";<br>JButton btnNew = new JButton("New";<br>JButton btnSave = new JButton("Save";<br>JButton btnDelete = new JButton("Delete";<br>JButton btnHelp = new JButton("Help";<br><br>setLayout(new GridBagLayout());<br><br>/*Do đối tượng GridBagConstaints tương đối phức tạp, để tránh lặp code, ta viết sẵn 3 phương thức<br>* createFixedHorzConstraints: Tạo ràng buộc không co giãn (Label)<br>* createHorzConstraints: Tạo ràng buộc co giãn theo chiều ngang (TextField)<br>* createBothHorzConstraints: Tạo ràng buộc co giãn theo 2 chiều (Table)<br>*/<br>add(lblID, createFixedHorzConstraints(0, 0, 1, 1));<br>add(txtID, createHorzConstraints(1, 0, 1, 1, 0.3));<br><br>add(lblFullName, createFixedHorzConstraints(2, 0, 1, 1));<br>add(txtFullName, createHorzConstraints(3, 0, 1, 1, 1));<br><br>add(lblGender, createFixedHorzConstraints(4, 0, 1, 1));<br>add(cbGender, createHorzConstraints(5, 0, 1, 1, 0.3));<br><br>add(lblAddr, createFixedHorzConstraints(0, 1, 1, 1));<br>add(txtAdrr, createHorzConstraints(1, 1, 5, 1, 1));<br><br>JPanel pnlController = new JPanel();<br>add(pnlController, createHorzConstraints(0, 2, 6, 1, 1));<br>pnlController.setLayout(new BoxLayout(pnlController, BoxLayout.X_AXIS));<br><br>pnlController.add(btnFind);<br>pnlController.add(Box.createHorizontalGlue());//phân chia nhóm<br><br>pnlController.add(btnNew);<br>pnlController.add(btnSave);<br>pnlController.add(btnDelete);<br><br>pnlController.add(Box.createHorizontalGlue());//phân chia nhóm<br>pnlController.add(btnHelp);<br><br><br>add(new JLabel("Available list: ", createFixedHorzConstraints(0, 3, 6, 1));<br>add(new JScrollPane(new JTable(100, 10)), createBothConstraints(0, 4, 6, 1, 1, 1));<br>}<br><br><br>public static void main(String args[]) {<br>//Tạm thời chưa cần biết LookAndFeel<br>try {<br>UIManager.setLookAndFeel("de.muntjak.tinylookandfeel.TinyLookAndFeel";<br>} catch (Exception e) {<br>e.printStackTrace();<br>}<br>new GridBagLayoutDemo();<br>}<br><br><br>public static GridBagConstraints createFixedHorzConstraints(int gridx, int gridy, int gridwidth, int gridheight) {<br>return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 0, 0,<br>GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(1, 12, 1, 2), 0, 0);<br>}<br><br>public static GridBagConstraints createHorzConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx) {<br>return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, 0.0,<br>GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(1, 0, 1, 0), 0, 0);<br><br>}<br><br>public static GridBagConstraints createBothConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double heightx) {<br>return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, heightx,<br>GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(1, 0, 1, 0), 0, 0);<br>}<br>}<br><br>Screenshot:<br><br>Online demo with LaF<br>Online demo without LaF<br>Quá nhiều rồi, tạp gác Layout lại bây giờ ta chuyển sang tìm hiểu Event và Listner<br><br>--------------------------------------------------------------------------------------------------------------------<br>5. Tìm hiểu về Event<br>--------------------------------------------------------------------------------------------------------------------<br>- Event là gì? Rất đơn giản, event là sự kiện. Vậy thực chất sự kiện là gì?<br>- Sự kiện là 1 cái gì đó xảy ra khi có yếu tố nội bộ hoặc ngoại cảnh tác động lên nó (rất trừu tượng)<br>- Lấy 1 số ví dụ sau nhé<br>+ Sự kiện Quốc tế phụ nữ vào ngày 8/3 hàng năm (Sự kiện thời gian)<br>+ Sự kiện sập tòa tháp đôi (Sự kiện Khủng bố)<br>- Ủa, Quốc tế phụ nữ hay sập tòa tháp đôi liên quan gì đến Java? Dĩ nhiên trong ngành phần mềm có những sự kiện riêng của nó. Sau đây là 1 số sự kiện cơ bản:<br><br><br>* KeyEvent: Xảy ra khi nhấn bàn phím<br>* MouseEvent: Xảy ra khi nhất chuột<br>* ActionEvent: Xảy ra khi có 1 hành động nào đó tác động: Click vào nút, chọn xong 1 item trong combobox, ...<br>* WindowEvent: Sự kiện liên quan đến Window: closed, opened, closing, ...<br>* FocusEvent: Liên quan đến focus và lost fucus<br>* ... Còn rất nhiều sự kiện khác, các bạn tìm hiểu thêm trong Javadoc<br>* &lt;Your Event Define&gt;, dĩ nhiên bạn cũng có thể tự định nghĩa thêm sự kiện mới phục vụ cho nhu cầu của mình (Xem phần 2)<br><br><br>Trong Java mọi sự kiện đều kế thừa trực tiếp hoặc gián tiếp từ lớp EventObject<br>- Tuy nhiên, thật là đơn điệu nếu ngày 8/3 không ai mong đợi hay đón nhận, thì nó chẳng khác gì ngày bình thường! Thông thường một khi đã có Sự kiện thì sẽ có sự Đón nhận, giống như các em thiếu nhi mong chờ sự kiện Quốc tế thiếu nhi để nhận quà. Trong phần mềm cũng thế 1 khi có sự kiện thì phải có sự đón nhận sự kiện hay Lắng nghe (Listener).<br>- Ví dụ, khi có sự kiện mouse click lên 1 nút lệnh nào đó, thì phải có Sự lắng nghe (Listener) để khi click vô nút lệnh nó sẽ gọi phương thức xử lý tương ứng<br>- Trong java, Event và Listener được sử dụng như thế nào? Thông thường Event ta không quan tâm, vì chúng được các Components lo rồi, ta chỉ quan tâm khâu đăng ký lắng nghe sự kiện và phương thức xử lý sự kiện.<br>- Tại sao phải đăng ký lắng nghe sự kiện? Để trả lời câu hỏi này tôi xin lấy 1 ví dụ: Đặt báo PC World Việt nam, quá trình được diễn ra như sau:<br>+ Lên tòa sọa và đăng ký đặt mua PC World và dĩ nhiên phải trả tiền (Đăng ký lắng nghe sự kiện)<br>+ Thông thường cứ tới giữa tháng (sự kiện thới gian) sẽ có 1 nhân viên nữ xinh đẹp của tòa soạn PC World mang báo đến cho bạn và bạn là người ra nhận báo (Xử lý sự kiện)<br>- Tóm lại, việc sử dụng Event và listener trong AWT, Swing như sau: (Có 2 cách)<br>Cách 1: Implements interface **********<br><br>public class TestEventAndListener extends JFrame implements ActionListener{<br>public TestEventAndListener(){<br>super("Event and Listener Demo";//đặt tiêu đề cho frame<br><br>JButton btnStudy = new JButton("Study J2SE";<br>btnStudy.addActionListener(this);//đăng ký lắng nghe sự kiện<br><br>setLayout(new BorderLayout());//set BorderLayout cho ContentPane của frame<br>add(btnStudy, BorderLayout.CENTER);//đăt nút lệnh tại vùng CENTER<br><br>pack();//điều chỉnh kích thích frame vừa đủ chứa các components<br>setVisible(true);//hiển thị frame<br>}<br><br>/*<br>* Khi có sự kiện mouse click lên nút btnStudy xảy ra thì phương thức này được gọi<br>*/<br>public void actionPerformed(ActionEvent event){<br>JOptionPane.showMessageDialog(this, "Study, study and study more", "Action Event", JOptionPane.INFORMATION_MESSAGE);<br>}<br><br>public static void main(String args[]){<br>new TestEventAndListener();<br>}<br>}<br><br>Online demo<br><br>Rõ ràng như bạn thấy đó, cách này không được hay lắm, giả sử interface ********** có nhiều method thì sao? Thì ta phải định nghĩa lại tất cả chúng (chỉ định định nghĩa prototype, không cần nội dung). Chính vì vậy, người ta (Sun chứ ai) mới đưa ra cách chặn sự kiến mới như sau:<br>- Thay vì ********** là interface, ta chuyển đó thành ********** implements interface **********<br>- Ví dụ interface WindowListenr, sẽ tương ứng là WindowAdatper, được định nghĩa như sau:<br><br>public class WindowAdapter implements WindowListener{<br>public void windowOpened(WindowEvent e) {<br>}<br><br>public void windowClosing(WindowEvent e) {<br>}<br><br>public void windowClosed(WindowEvent e) {<br>}<br><br>public void windowIconified(WindowEvent e) {<br>}<br><br>public void windowDeiconified(WindowEvent e) {<br>}<br><br>public void windowActivated(WindowEvent e) {<br>}<br><br>public void windowDeactivated(WindowEvent e) {<br>}<br>}<br><br>Trên đây là mã nguồn của lớp WindowAdapter. Tuy nhiên Sun đã thực hiện hết dùm ta, chỉ việc sử dụng thôi<br>Cách 2: Kế thừ từ lớp **********<br>Sau đây là ví dụ chặn sử kiện đóng Frame. Khi đó frame, hỏi ta có muốn đóng hay không?<br><br>public class WindowClosingDemo extends JFrame{<br>public WindowClosingDemo() {<br>super("Window closing demo";<br>setSize(800, 600);<br><br>registerListener();<br><br>setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);<br>setVisible(true);<br>}<br><br>private void registerListener(){<br>this.addWindowListener(new WindowAdapter(){<br>public void windowClosing(WindowEvent e) {<br>int result = JOptionPane.showConfirmDialog(WindowClosingDemo.this,<br>"Do you want to leave me?", "Exit App", JOptionPane.YES_NO_OPTION);<br>if(result==JOptionPane.YES_OPTION)<br>System.exit(0);<br>}<br><br>});<br>} <br><br>public static void main(String args[]) {<br>new WindowClosingDemo();<br>}<br>}<br><br>Online demo<br>Sự kiện và lắng nghe sự kiện nhiêu đây chắc tạm đủ, mời bạn relax với Splashscreen<br><br>--------------------------------------------------------------------------------------------------------------------<br>6. Splash screen<br>--------------------------------------------------------------------------------------------------------------------<br>- Thông thường ứng dụng của ta viết ra, chúng phải thực hiện một số tác vụ "làm thủ tục" trước khi hiện lên cho người dùng sẵn sàng sử dụng. Thời gian này khá lâu, đặc biệt là ứng dụng Java. Do đó để người dùng không nóng lòng, người ta lại chế ra cái khái niệm SplashScreen. SplashScreen là màn hình lé lên trong khi khởi động ứng dụng rồi vội vàng dập tắt đi khi ứng dụng nạp xong. Nhưng không hẵn là thế, có người còn cố tình làm chậm khâu khởi động, vì SplashScreen của họ khá đẹp muốn end user chiêm ngưỡng hay chỉ đơn giản là quảng cáo!<br>- Vậy trong Java thực hiện SplashScreen như thế nào?<br>Trước mắt chúng ta có 3 cách thực hiện:<br>- Sử dụng thành phần Swing làm SplashScreen: Cách này có 1 yếu điểm là bản thân Swing vốn dĩ load đã chậm rồi, do đó người ta thường chọn cách 2<br>- Sử dụng thành phần AWT làm SplashScreen, vì AWT hơn nên thời gian nạp SplashScreen nhanh hơn Swing<br>- May mắt thay, Java 1.6 ra đời có sẵn SplashScreen luôn. SplashScreen trong Java 1.6 khởi động trước cà JVM do đó thời gian nạp SplashScreen gần như tức thời.<br>- Tôi xin trình bày xây dựng SplashScreen theo cách 3, cách 1 và 2 để dành cho bạn tìm hiểu<br>- Ta có 2 cách thực hiện SplashScreen trong Java 1.6 tùy vào hình thức ta deploy<br>+ Nếu deploy cho anh em dòng họ *nix sử dụng (Command line) thì ta bổ sung thêm tham số -splash<br>java -spalsh: &lt;splashscreen image&gt; [other param] MainClass<br>+ Còn nếu deploy bằng .Jar thì bổ xung thêm dòng Splashscreen-image: &lt;splashsreen image&gt; vào file MANIFEST.MF (Xem phần jar deploy)<br><br>--------------------------------------------------------------------------------------------------------------------<br>7. Xây dựng ví dụ mẫu<br>--------------------------------------------------------------------------------------------------------------------<br>Ta tạm chọn 1 ví dụ đơn giản nhất làm demo, đó là xây dựng ứng dụng Mã hóa<br>Bây giờ ta làm step by step nhé<br>Bước 1: Requirement (Yêu cầu) Xây dựng ứng dụng có chức năng mã hóa 1 chuỗi theo thuật toán SHA-1, MD2 hoặc MD5. Có chức năng kiểm tra ngược.<br><br>Online demo đây nè: With LookAndFeel | Without LookAndFeel<br><br>Bước 2: Phân tích (Bỏ qua vì Project quá tí hon)<br><br>Bước 3: Thiết kế (Bỏ qua vì Project quá tí hon)<br><br>Bước 4: Test thiết kế và viết test case (Bỏ qua vì Project quá tí hon)<br><br>Bước 5: Code (không bỏ được)<br>Bước 5.1: Khởi động Eclipse, tạo project mới<br>-&gt; Menu File -&gt; New -&gt; Project ...<br><br><br>Bước 5.2: Đặt tên project<br>-&gt; Xem hình<br><br><br>Bước 5.3: Add lib, những thứ linh tinh khác<br>-&gt; Add xong, nhấn Finish<br><br>Bước 5.4: Tạo thư mục src<br>-&gt; Right click vào project mới tạo, chọn properties<br>-&gt; Nhấn nút Add Foder -&gt; Create New Folder -&gt; Nhập tên folder<br><br><br><br>Bước 5.5: Tạo các class cần thiết<br>-&gt; Right click vào project trên, chọn Menu New -&gt; Class, nhập package là com.pissoft.session1, tên class là: EncryptApp, nhập xong sẽ như sau:<br><br>Thực hiện tương tự cho 2 class còn lại: EncryptFrame và GridBagLayoutEx<br>Khi xong, bạn thấy project có cấu trúc như sau:<br><br><br>Project của ta chỉ vỏn vẹn 3 class:<br>- EncryptApp: đây là class chính (chứa phương thức main), class này chỉ làm nhiệm vụ setLookAndFeel và khởi tạo EncryptFrame<br>- EncryptFrame: đây là class chứa Frame chính và những xử lý khác (tạm thời để chung)<br>- GridBagLayoutEx: Đây là lớp kế thừa từ GridBagLayout, giúp ta thiết kế GUI nhanh hơn thui, chỉ là Uitility thôi.<br>Nội dung file EncryptApp.java<br><br>package com.pissoft.session1;<br><br>import javax.swing.UIManager;<br>import javax.swing.UnsupportedLookAndFeelException;<br><br>public class EncryptApp {<br><br>public static void main(String[] args) {<br>//install TinyLookAndFeel<br>try {<br>UIManager.setLookAndFeel("de.muntjak.tinylookandfeel.TinyLookAndFeel";<br>} catch (ClassNotFoundException e) {<br>e.printStackTrace();<br>} catch (InstantiationException e) {<br>e.printStackTrace();<br>} catch (********** e) {<br>e.printStackTrace();<br>} catch (UnsupportedLookAndFeelException e) {<br>e.printStackTrace();<br>}<br><br>//new and show main frame<br>new EncryptFrame();<br>}<br>}<br><br><br>Nội dung file EncryptFrame.java (Hơi dài tí)<br><br>package com.pissoft.session1;<br><br>import java.awt.Toolkit;<br>import java.awt.event.ActionEvent;<br>import java.awt.event.ActionListener;<br>import java.security.MessageDigest;<br>import java.security.NoSuchAlgorithmException;<br><br>import javax.swing.BorderFactory;<br>import javax.swing.Box;<br>import javax.swing.BoxLayout;<br>import javax.swing.JButton;<br>import javax.swing.JComboBox;<br>import javax.swing.JFrame;<br>import javax.swing.JLabel;<br>import javax.swing.JOptionPane;<br>import javax.swing.JPanel;<br>import javax.swing.JTextField;<br><br>public class EncryptFrame extends JFrame{<br>private static final long serialVersionUID = -4229685511765327513L;<br><br>private JLabel lblSource = new JLabel("Source: ", JLabel.RIGHT);<br>private JTextField txtSource = new JTextField();<br><br>private JLabel lblAlgorithm = new JLabel("Algorithm: ", JLabel.RIGHT);<br>private JComboBox cbAlgorithm = new JComboBox(new String[]{"SHA-1", "MD2", "MD5"});<br><br>private JLabel lblDest = new JLabel("Dest: ", JLabel.RIGHT);<br>private JTextField txtDest = new JTextField();<br><br>private JButton btnEncrypt = new JButton("Encrypt";<br>private JButton btnCheck = new JButton("Check";<br><br>public EncryptFrame(){<br>super("Encrypt Demo";<br>initFrame();<br>buidGUI();<br>registerListener();<br><br>setVisible(true);<br>}<br><br>private void initFrame(){<br>//Put frame at the center of the Desktop<br>int frameX = (Toolkit.getDefaultToolkit().getScreenSize().width - getWidth()) / 2;<br>int frameY = (Toolkit.getDefaultToolkit().getScreenSize().height - getHeight()) / 2;<br>this.setLocation(frameX, frameY);<br><br>//Require app end when frame closed<br>this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br><br>} <br><br>private void buidGUI(){<br>GridBagLayoutEx layout = new GridBagLayoutEx();<br>setLayout(layout);<br><br>add(lblSource, layout.createFixedConstraints());<br>add(txtSource, layout.createHorzGlueConstraints());<br><br>layout.newRow();<br>add(lblAlgorithm, layout.createFixedConstraints());<br>add(cbAlgorithm, layout.createHorzGlueConstraints());<br><br>layout.newRow();<br>add(lblDest, layout.createFixedConstraints());<br>add(txtDest, layout.createHorzGlueConstraints());<br><br>layout.newRow();<br>add(Box.createVerticalGlue(), layout.createMergeAllGlueConstraints());<br><br><br>layout.newRow();<br>JPanel pnlController = new JPanel();<br>add(pnlController, layout.createMergeAllHorzGlueConstraints());<br>pnlController.setLayout(new BoxLayout(pnlController, BoxLayout.X_AXIS));<br><br>pnlController.add(Box.createHorizontalGlue());<br>pnlController.add(btnEncrypt);<br>pnlController.add(Box.createHorizontalStrut(4));<br>pnlController.add(btnCheck);<br><br>pack();<br>}<br><br>private void registerListener(){<br><br>btnEncrypt.addActionListener(new ActionListener(){<br>public void actionPerformed(ActionEvent e) {<br>String dest = encrypt(txtSource.getText(), (String)cbAlgorithm.getSelectedItem());<br>txtDest.setText(dest);<br>}<br>});<br><br>btnCheck.addActionListener(new ActionListener(){<br>public void actionPerformed(ActionEvent e) {<br>Boolean isSuccessed = check(txtDest.getText(), txtSource.getText(), (String)cbAlgorithm.getSelectedItem());<br>String message[]={"Fail", "Successful"};<br>JOptionPane.showMessageDialog(EncryptFrame.this, message[isSuccessed?1:0]);<br>}<br>});<br>}<br><br>public String encrypt(String source, String algorithm){<br>MessageDigest digester=null;<br>try {<br>digester = MessageDigest.getInstance(algorithm);<br>} catch (NoSuchAlgorithmException e) {<br>e.printStackTrace();<br>}<br><br>if(digester==null)<br>return null;<br><br>byte dest[] = digester.digest(source.getBytes());<br><br>return new String(dest);<br>}<br><br>public boolean check(String secret, String source, String algorithm){<br>return secret.equals(encrypt(source, algorithm));<br>}<br>}<br><br>Nội dung file GridBagLayoutEx.java (Quá dài luôn, nhưng không quan trọng chỉ là làm đơn giản hóa GridBagConstraints thôi)<br><br>package com.pissoft.session1;<br><br>import java.awt.GridBagConstraints;<br>import java.awt.GridBagLayout;<br>import java.awt.Insets;<br><br>public class GridBagLayoutEx extends GridBagLayout {<br>/**<br>*<br>*/<br>private static final long serialVersionUID = 556538646538435067L;<br>private int row=0;<br>private int column=0;<br><br><br>public void newRow(){<br>row++;<br>column=0;<br>}<br><br>public void newColumn(){<br>column++;<br>}<br><br>/**<br>* Create fixed both side constraints<br>* @param pLeftBoundary<br>* @return<br>*/<br>public GridBagConstraints createFixedConstraints(boolean pLeftBoundary) {<br>return createFixedConstraints(pLeftBoundary, 1);<br>}<br><br>/**<br>* Create fixed both side constraints<br>* @param pLeftBoundary<br>* @param pGridWidth<br>* @return<br>*/<br><br>public GridBagConstraints createFixedConstraints(boolean pLeftBoundary,<br>int pGridWidth) {<br>return createFixedConstraints(pLeftBoundary, pGridWidth, 1);<br>}<br><br>/**<br>* Create fixed both side constraints<br>* @param pLeftBoundary boolean<br>* @param pGgridWidth int<br>* @param pGridHeight int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createFixedConstraints(boolean pLeftBoundary,<br>int pGridWidth, int pGridHeight) {<br><br>GridBagConstraints lGridBagConstraints = new GridBagConstraints(row, column, pGridWidth, pGridHeight, 0, 0,<br>GridBagConstraints.CENTER,<br>GridBagConstraints.HORIZONTAL,<br>pLeftBoundary==true? new Insets(1, 0, 1, 2):new Insets(1, 12, 1, 2), 0, 0);<br>column+=pGridWidth;<br><br>return lGridBagConstraints;<br>}<br><br>/**<br>* Create fixed both side constraints<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createFixedConstraints() {<br>return createFixedConstraints( 1);<br>}<br><br>/**<br>* Create fixed both side constraints<br>* @param pGridWidth int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createFixedConstraints(int pGridWidth) {<br>return createFixedConstraints(pGridWidth, 1);<br>}<br><br>/**<br>* Create fixed both side constraints<br>* @param pGridWidth int<br>* @param pGridHeight int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createFixedConstraints(int pGridWidth, int pGridHeight) {<br><br>GridBagConstraints lGridBagConstraints = new GridBagConstraints(column, row, pGridWidth, pGridHeight, 0, 0,<br>GridBagConstraints.CENTER,<br>GridBagConstraints.HORIZONTAL,<br>new Insets(1, 12, 1, 2), 0, 0);<br><br>column+=pGridWidth;<br><br>return lGridBagConstraints;<br><br>}<br><br>/**<br>* Create horizontal glue constraints<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createHorzGlueConstraints() {<br>return createHorzGlueConstraints(1);<br>}<br><br>/**<br>* Create horizontal glue constraints<br>* @param pGridWidth int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createHorzGlueConstraints(int pGridWidth) {<br>return createHorzGlueConstraints(pGridWidth, 1);<br>}<br><br>/**<br>* Create horizontal glue constraints<br>* @param pGridWidth int<br>* @param pGridHeight int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createHorzGlueConstraints(int pGridWidth,<br>int pGridHeight) {<br>return createHorzGlueConstraints(pGridWidth, pGridHeight, 1.0);<br>}<br><br>/**<br>* Create horizontal glue constraints<br>* @param pGridWidth int<br>* @param pGridHeight int<br>* @param pWeightX double<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createHorzGlueConstraints(int pGridWidth,<br>int pGridHeight, double pWeightX) {<br><br>GridBagConstraints lGridBagConstraints = new GridBagConstraints(column, row, pGridWidth, pGridHeight, pWeightX, 0.0,<br>GridBagConstraints.CENTER,<br>GridBagConstraints.HORIZONTAL,<br>new Insets(1, 0, 1, 0), 0, 0);<br>column+=pGridWidth;<br>return lGridBagConstraints;<br><br>}<br><br>/**<br>* create fixed constraints and merge all columns<br>* @return<br>*/<br>public GridBagConstraints createMergeAllFixedConstraints() {<br>return createFixedConstraints(100);<br><br>}<br><br>/**<br>* create horizontal glue and merge all columns<br>* @return<br>*/<br>public GridBagConstraints createMergeAllHorzGlueConstraints() {<br>return createHorzGlueConstraints(100);<br><br>}<br><br>/**<br>* create both side glue constraints and merge all columns<br>* @return<br>*/<br>public GridBagConstraints createMergeAllGlueConstraints() {<br>return createGlueConstraints(100);<br><br>}<br><br>/**<br>* Create both side glue constraints<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createGlueConstraints() {<br>return createGlueConstraints(1);<br>}<br><br>/**<br>* Create both side glue constraints<br>* @param pGridWidth int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createGlueConstraints(int pGridWidth) {<br>return createGlueConstraints(pGridWidth, 1);<br>}<br><br>/**<br>* Create both side glue constraints<br>* @param pGridWidth int<br>* @param pGridHeight int<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createGlueConstraints(int pGridWidth,<br>int pGridHeight) {<br>return createGlueConstraints(pGridWidth, pGridHeight, 1.0);<br>}<br><br>/**<br>* Create both side glue constraints<br>* @param pGridWidth int<br>* @param GridHeight int<br>* @param pHeightX double<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createGlueConstraints(int pGridWidth,<br>int GridHeight, double pHeightX) {<br>return createGlueConstraints(pGridWidth, GridHeight, 1.0, pHeightX);<br>}<br><br>/**<br>* Create both side glue constraints<br>* @param pGridWidth int<br>* @param pGridHeight int<br>* @param pWeightX double<br>* @param pHeightX double<br>* @return GridBagConstraints<br>*/<br>public GridBagConstraints createGlueConstraints(int pGridWidth,<br>int pGridHeight, double pWeightX, double pHeightX) {<br><br>GridBagConstraints lGridBagConstraints = new GridBagConstraints(column, row, pGridWidth, pGridHeight, pWeightX, pHeightX,<br>GridBagConstraints.CENTER,<br>GridBagConstraints.BOTH,<br>new Insets(1, 0, 1, 0), 0, 0);<br>column+=pGridWidth;<br><br>return lGridBagConstraints;<br><br>} <br>}<br><br>Bước 6: Unit Test (Bỏ qua vì Project quá tí hon)<br><br>Bước 7: Production test/System test (Bỏ qua vì Project quá tí hon)<br><br>Bước 8: Deploy (Xem mục Jar deploy)<br><br>Bước 9: Bàn giao và thu tiền (Nhường lại cho các bạn)<br><br>--------------------------------------------------------------------------------------------------------------------<br>8. Pluggable Look and Feel<br>--------------------------------------------------------------------------------------------------------------------<br>- Vừa xây dựng ứng dụng xong, thấy vui vui, nhưng sao giao diện của ứng dụng Swing xấu quá. Vậy phen này chắc bỏ Java qua .NET quá!<br>- Đừng nóng bạn ơi, Java hiểu điều đó nên hỗ trợ LookAndFeel cho bạn đây, đó là kỹ thuật thay đổi hình dạng và cách ứng xử của toàn ứng dụng ngay lúc Runtime, có người dịch là cảm quan, nghe khó hiểu quá. Thôi thì cứ gọi là ... LookAndFeel cho rồi.<br>- Các bạn có thể tải hàng đống LookAndFeel tại javootoo.l2fprod.com/plaf/oyoaha/index.php<br>- Thay đổi LookAndFeel chỉ đơn giản như sau:<br><br>try {<br>UIManager.setLookAndFeel("de.muntjak.tinylookandfeel.TinyLookAndFeel";//thay bằng LookAndFeel của bạn<br>} catch (ClassNotFoundException e) {<br>e.printStackTrace();<br>} catch (InstantiationException e) {<br>e.printStackTrace();<br>} catch (********** e) {<br>e.printStackTrace();<br>} catch (UnsupportedLookAndFeelException e) {<br>e.printStackTrace();<br>}<br>hay gọn gàng hơn<br>try {<br>UIManager.setLookAndFeel("de.muntjak.tinylookandfeel.TinyLookAndFeel";//thay bằng LookAndFeel của bạn<br>} catch (Exception e) {<br>e.printStackTrace();<br>}<br><br><br>--------------------------------------------------------------------------------------------------------------------<br>9. Jar deploy<br>--------------------------------------------------------------------------------------------------------------------<br>- Một khi đã xậy dựng xong phần mềm thì phần mềm đó chỉ có LTV mới sử dụng được. Muốn phân phối đến end user, chúng ta phải có chương trình đóng gói, cài đặt cho họ.<br>- Đối với các LTV VB, VC, .NET thì ít quan tâm điều này, vì IDE làm sẵn hết cho họ, họ chỉ việc nhấn nút Build và dùng chương trình Setup để deploy là xong, còn đối với Java thì khác. Tại sạo điều này khó thực hiện đối với Java? Vì Java là Platform Indepdent mà! Nó đâu biết dịch ra mã máy để chạy trên HĐH nào. (Vì có quá nhiều HĐH).<br>- Giải pháp của Java là dịch ra mã trung gian, không phụ thuộc nền (các .class), sau đó nén các file này lại tạo thành file .Jar<br>- Có rất nhiều cách tạo ra file .jar, ở đây tôi giới thiệu cách đơn giản nhất là dùng WinRAR để nén các .class và các resources đi theo (Vì file .jar thực chất là file .zip)<br>- Tuy nhiên để file jar có thể khởi động (double vào), giống như các chương trình Native code thì bạn phải thực hiện thêm bước nữa, đó là soạn file MANIFEST.MF, mục đích file này là mô tả cho file .jar thôi, cụ thể là nó cho biết Main Class là class nào. Nội dung của file này như sau:<br><br>Manifest-Version: 1.0<br>Created-By: 1.6.0-beta2 (Sun Microsystems Inc.)<br>Main-Class: com.pissoft.session1.EncodePasswordApp<br>SplashScreen-Image: java.jpg<br><br>- Sau đó ta đặt file này vào thư mục META-INF, vậy cấu trúc thư mục trước khi nén như sau:<br><br>encrypt-&gt;tên project<br>com<br>| pissoft<br>| | session1<br>| | | EncryptApp.class<br>| | | EncryptFrame.class<br>| | | GridBagLayoutEx.class<br>MATA-INF<br>| | MANIFEST.MF<br>splashscreen.jpg <br><br>- Đứng tại thư mục con của encrypt, dùng WinRAR, WinZip hoặc Zip của Windows XP cũng được<br>- Nén các file và thư mục trên lại, chọn định dạng nén là ZIP (chọn RAR là đi bụi luôn đó)<br>- Đặt tên file là encrypt.jar<br>- Thế là xong, bạn có thể chạy bằng 3 cách:<br>+ Mở command line lên, gõ lệnh java -jar encrypt.jar -&gt; End user không dám sử dụng cách này<br>+ Double click vào biểu tượng file encrypt.jar<br>+ Nếu cách 2 không thực hiện được, có nghĩa là định dạng file .jar mặc định không được mở bằng JVM, thì chọn giải pháp sau: right click lên file encrypt.jar, chọn open with .... và chỉ đến javaw.exe (trên windows) hoặc java (*nix)<br>- Như thế là tạm được rồi, còn nếu muốn chuyên nghiệp hơn xin mời qua mục kế tiếp<br><br>--------------------------------------------------------------------------------------------------------------------<br>10. Deploy with Setup application<br>--------------------------------------------------------------------------------------------------------------------<br>- Nếu muốn ứng dụng của mình chuyên nghiệp hơn hoặc ứng dụng quá phức tạp, phải đăng ký tùm lum thứ khi cài đặt thì khi đó phải nhờ đến chương trình đóng gói (Installer) chuyên nghiệp như: InstallAnywhere, iInstallShield, nstall4j, Advanced Installer for Java, JExpress, ...<br>- Nhưng 1 điều đáng buồn là tất cả bọn chúng đều Commercial. Đành phải sử dụng crack thôi ... cũng may mắn là trong lúc crack, tình cờ tìm được 1 em Java Installer khá tốt, nhưng free và open source nữa, đó là IzPack.<br><br>- IzPack để cho các bạn tự tìm hiểu nhé, Download tại <!-- m --><a class="postlink" href="http://www.izforge.com/izpack">http://www.izforge.com/izpack</a><!-- m --><br><br>Online Java Installer<br>Nếu không chạy được thì download File này dìa chạy nhé<br>--------------------------------------------------------------------------------------------------------------------<br>11. Deploy Desktop Application qua web(Java Web Start)<br>--------------------------------------------------------------------------------------------------------------------<br>- Nhiều lúc bạn làm xong phần mềm, muốn mang lên mạng rao bán, nhưng nếu người ta không chạy thử thì không dám mua.<br>Vậy có cách nào cho ứng dụng Java Desktop chạy qua Web không? Cám ơn Sun, vì họ đã hỗ trợ Java Web Start giúp ta làm chuyện này.<br>- Cách thực hiện đơn giản như sau:<br>a. Nén ứng dụng thành .jar (Jar deploy)<br>b. Viết file encrypt.jnlp, có nội dung như sau:<br><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;jnlp spec="1.0+" codebase="www.pissoft.com/javavietnam/articles/javadesktop/session1" href="encrypt.jnlp"&gt;<br>&lt;information&gt;<br>&lt;title&gt;Encrypt app&lt;/title&gt;<br>&lt;vendor&gt;Pissoft Open Source Software&lt;/vendor&gt;<br>&lt;homepage href="www.pissoft.com" /&gt;<br>&lt;description&gt;Powerful Encrypt Application&lt;/description&gt;<br>&lt;/information&gt;<br>&lt;resources&gt;<br>&lt;j2se version="1.6+"/&gt;<br>&lt;jar href="encrypt.jar"/&gt;<br>&lt;/resources&gt;<br>&lt;application-desc main-class="com.pissoft.session1.EncryptApp" /&gt;<br>&lt;/jnlp&gt;<br><br>c. Đặt file .jar, file encrypt.jnlp và các file, thư mục liên quan vào web server của bạn<br>d. AddType vào web server, với Apache, ta làm như sau:<br>AddType application/x-java-jnlp-file .jnlp<br>e. Viết trang HTML link đến file encrypt.jnlp. Ví dụ: &lt;a href="encrypt.jnlp"&gt;Online demo&lt;/a&gt;<br>Tham khảo toàn bộ cấu trúc của file .jnlp tại java.sun.com/j2se/1.5.0/docs/guide/javaw...ersguide/syntax.html<br><br>--------------------------------------------------------------------------------------------------------------------<br>12. FAQ<br>--------------------------------------------------------------------------------------------------------------------<br>Q1 Thấy Layout cũng hay, nhưng trước giờ quen dùng VB rồi, có cách nào thực hiện tương tự trong Java không?<br>A: Có, bạn chọn "null" Layout<br><br>Q2: Tại sao phải code GUI, bộ java không có tools kéo thả giống VB sao?<br>A: Java có rất nhiều tools giúp kéo thả GUI, nhưng theo kinh nghiệm của tôi thì code vừa chính xác, vừa nhanh, dễ dàng kiểm soát code (Sau khi đọc xong phần 5 - Xây dựng Swing Framework riêng, bạn sẽ thấy code GUI cho Java sướng đến mức nào)<br><br>Q3: Tôi có thể dịch file .jar ra native code không?<br>A: Trên lý thuyết là được, nhưng không chắc ăn lắm. Giải pháp thông thường người ta chọn là dùng bộ phận khởi động bằng Native code để khởi động Java. Đây là 1 hình thức giả tạo thôi, chứ buộc cũng phải cài JVM mới chạy được.<br>JBuilder, và những chương trình Java Installer có chức năng này<br><br>Q4: Tại sao tôi thay đổi LookAndFeel cho ứng dụng dùng AWT, không thấy kết quả gì hết?<br>A: Vì LookAndFeel chỉ hỗ trợ cho Swing<br><br>Q5: Máy tôi không cài sẵn WinRAR vậy muốn deploy dạng file Jar thì phải làm sao?<br>A: Sử dụng lệnh jar của Java (Command line) hoặc Ant hoặc dùng các IDE: Eclipse, JBuilder, ...<br><br>Q6: Tại sao biểu tượng của file encrypt.jar trên máy tôi là biểu tưởng của WinRAR và khi double thì nó được mở bằng WinRAR<br>A: Điều này là do bạn cài đặt WinRAR sao khi cài Java, hay nói cách khác là WinRAR đang là chương trình mặc định mở file dạng .Jar. Để khắc phục chỉ đơn giản đăng ký chương trình mở file .jar mặc định là Java<br><br>Q7: Tôi muốn nén cái thư viện kèm theo (.jar) vào thành 1 file jar duy nhất được ko?<br>A: Được, bạn có thể dùng thủ công như sau:<br>- Giải nén tất cả file thư viện (.jar)<br>- Giải nén file .jar của chính ứng dụng<br>- Đổ hết vào 1 thư mục, sau đó nén tất cả các file và thư mục này lại, ta được 1 file .jar duy nhất<br>- Lưu ý: bạn phải giải nén các file .jar, chứ để file .jar trong file .jar thì JVM không tìm thấy Classpath<br><br><br>Q8: Java Web Start hay quá, vậy em là dân .NET thì có cái nào tương tự không? (Xin lỗi mấy anh em .NET nếu mạo phạm)<br>A: Có, đó chính là ClickOne, support từ .NET Framework 2.0</div>

					
						<span class="postbody signature"><br><span class="line">_________________</span><br><div style="text-align: left;">....banana....<img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/banana.gif" alt="Hình ảnh">....banana...</div><br><div style="text-align: left;"><span style="font-size: 100%; line-height: normal"><span style="color: #FF4000"><span style="font-style: italic">.   .   .     Lang thang trong cỏi hồ mê     </span></span></span></div><br><div style="text-align: left;"><span style="font-size: 100%; line-height: normal"><span style="color: #FF4000"><span style="font-style: italic">Vô hình, vô bóng, chỉ là khói sương</span></span></span></div></span>
					<br clear="all"><br>
					<div style="float:right">
						
					<!-- Mod_Share_On by JesusADS -->	<a href="http://www.facebook.com/share.php?u=http://www.08hc.com/4rum/viewtopic.php?t=2372" target="_blank"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/shareon_facebook.png" alt="Share on Facebook" title="Share on Facebook"></a>	<a href="http://twitter.com/home?status=[Swing]%20-%20X%C3%A2y%20d%E1%BB%B1ng%20giao%20di%E1%BB%87n%20b%E1%BA%B1ng%20Swing%20(from%20@YOUR_FORUM_TWITTER_ID)%20http://www.08hc.com/4rum/viewtopic.php?t=2372" target="_blank"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/shareon_twitter.png" alt="Share on Twitter" title="Share on Twitter"></a>	<a href="http://delicious.com/post?url=http://www.08hc.com/4rum/viewtopic.php?t=2372&title=[Swing]%20-%20X%C3%A2y%20d%E1%BB%B1ng%20giao%20di%E1%BB%87n%20b%E1%BA%B1ng%20Swing" target="_blank"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/shareon_delicious.gif" alt="Share on Delicious" title="Share on Delicious"></a><!-- Mod_Share_On -->
					</div>
			</td>
		</tr>

		<tr class="row1">

			<td class="postbottom" align="center">T.Bảy Tháng 9 04, 2010 5:07 pm</td>
			<td class="postbottom postbuttons" valign="middle">
				
					<div style="float: right">
					
					</div>
				<a href="http://www.08hc.com/4rum/memberlist.php?mode=viewprofile&u=563&sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_user_profile.gif" height="13" alt="Xem thông tin cá nhân" title="Xem thông tin cá nhân"></a> 
			</td>
    	
		</tr>
	
	<tr>
		<td class="spacer" colspan="2" height="1"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" alt="" width="1" height="1"></td>
	</tr>
	
	<tr class="row2">
		<td colspan="2">
			<div id="thanks_table_35926">
				<table class="tablebg" width="100%" cellspacing="1" style="border: 1px solid #CCCCCC;margin: 5px 0px;">
					<tbody><tr>
						<td class="row1" style="background-color: rgb(255, 255, 231);padding: 5px;font-size: 8pt;" width="100%">The following user would like to thank <a href="http://www.08hc.com/4rum/memberlist.php?mode=viewprofile&u=563&sid=35e863f12de61c3900a72eee590ee439" style="color: #2981B4;" class="username-coloured">bangchu</a> for this post<br><a href="http://www.08hc.com/4rum/memberlist.php?mode=viewprofile&u=460&sid=35e863f12de61c3900a72eee590ee439" style="color: #2981B4;" class="username-coloured">cu_chuoi</a> (CN Tháng 9 05, 2010 6:08 pm)</td>
					</tr>
				</tbody></table>
			
			</div>
		</td>
	</tr>
	<tr>
		<td class="spacer" colspan="2" height="1"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" alt="" width="1" height="1"></td>
	</tr>
	<tr class="row2">

			<td align="center" valign="top" class="row">
				<a name="p35927"></a>
				<div class="postauthor" style="color: #2981B4">Tâm Nguyễn</div>
				<div class="postavatar"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/file(1).php" width="96" height="96" alt="Hình đại diện của thành viên"></div>

				<div class="postdetails">
					<br><b>Ngày tham gia:</b> T.Bảy Tháng 2 21, 2009 11:00 pm<br><b>Bài viết:</b> 324<br><strong>Thanks:</strong>0 lần
					<br><b>Thanked:</b> 28 lần trong 16 posts
					
				</div>
				<img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" width="120" height="1" alt="">
			</td>
			<td width="100%" height="25" class="row" valign="top">
				<div style="float: right;"><a style="text-decoration:none;" id="thanksimg35927" href="http://www.08hc.com/4rum/thanks.php?p=35927&mode=thanks&sid=35e863f12de61c3900a72eee590ee439" onclick="thankspost(&#39;./thanks.php?p=35927&amp;mode=thanks&amp;sid=35e863f12de61c3900a72eee590ee439&#39;,35927,150,1); return false;"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/thankposts.gif" alt="Thanks">&nbsp;&nbsp;</a></div>
				<div class="postsubject"><a href="http://www.08hc.com/4rum/viewtopic.php?p=35927&sid=35e863f12de61c3900a72eee590ee439#p35927"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_topic_latest.gif" width="13" height="9" alt="Gửi bài" title="Gửi bài"></a>&nbsp;Re: [Swing] - Xây dựng giao diện bằng Swing</div>

					

						<div class="postbody">1. Swing kế thừa từ AWT, nó nhiều tính năng hơn so với pack AWT cũ (nhẹ hơn, ít tốn tài nguyên của máy trạm).<br>2. Event: Một tác động bất kỳ được người dùng tạo ra hoặc do các process phát sinh trong quá trình thực thi. Java định nghĩa sự kiện qua các Interface, kế thừa từ AWT.Events. Những sự kiện được tạo ra có một ID để tìm những funcs xử lý thích hợp cho nó -&gt; Lập trình dạng hướng sự kiện. (MVC)<br>3. Layout: Cái này tùy thuộc vào thẩm mỹ của từng người mà nó sẽ có sự khác biệt về bố trí.<br>_ Nếu một giao diện kết hợp quá nhiều Components (Comps) sẽ gây rối mắt và khó sắp xếp vị trí.<br>_ Một Frame chỉ dùng tối đa từ 1-4 Layout (1 layout chính và 3 layout phụ), các layout này được bố trí bằng Panel (từ từ sẽ biết).<br>4. <span style="font-weight: bold">Lập trình trên Java phải tận dụng tối đa việc kế thừa từ các lớp đã có</span>, hạn chế việc xây dựng lại (rất mất thời gian và gây khó khăn trong maintanance). Điều này là hiển nhiên, vì OS là phải vậy thì devs mới có hứng thú để deploy lên chứ, chứ có sẵn hết thì chán lắm, nhưng đừng nghĩ là những ứng dụng lớn viết bằng Java mất thời gian hơn. Trên thực tế cho thấy, việc phát triển những ứng dụng phân tán trên Java rất ổn định và tốn ít thời gian hơn so với .Net, mức độ bảo mật cũng rất mạnh do có rất nhiều hãng bảo mật hàng đầu thế giới phát triển thêm những module tích hợp cho nền J (mức chi phí đầu tư cũng thấp hơn .Net).<br>5. Nói một cách khác, mỗi một Framework có cái giá phải trả khác nhau thì sẽ tương ứng với các nhu cầu khác nhau của người sử dụng, người ta phát triển một công nghệ không phải là để sử dụng cho "sang" thôi, nó là một cột mốc để những nhà phát triển ứng dụng tích hợp và hệ thống hạ tầng cơ sở dựa vào đó để đưa ra những chuẩn phù hợp với nhu cầu, từ đó phát triển những Framework của riêng họ để tăng thêm hiệu quả sử dụng và tiết kiệm chi phí. Nếu các bạn viết ứng dụng (web hoặc app) mà phân chia ra được các platform độc lập riêng rẽ -&gt; Đẳng cấp của bạn đã ở một mức cao hơn rất nhiều so với trước đây rồi.<br>* Một số kinh nghiệm nhỏ mà T thu thập được: (ai thấy dở xin đừng chém)<br>_ Lập trình bằng Java thì bạn mới biết được khả năng linh hoạt và sử dụng tools phụ trợ của mình pro đế mức độ nào.<br>_ Khi viết thành công một ứng dụng J tuy nhỏ với 1 số chức năng đơn giản cơ bản (nói vậy chứ không phải dễ ăn đâu :D) bạn sẽ có rất nhiều kinh nghiệm trên mức tuyệt vời so với 1 ứng dụng tương tự bạn viết bằng C#.</div>

					<br clear="all"><br>
					<div style="float:right">
						
					<!-- Mod_Share_On by JesusADS --><!-- Mod_Share_On -->
					</div>
			</td>
		</tr>

		<tr class="row2">

			<td class="postbottom" align="center">T.Bảy Tháng 9 04, 2010 8:19 pm</td>
			<td class="postbottom postbuttons" valign="middle">
				
					<div style="float: right">
					
					</div>
				<a href="http://www.08hc.com/4rum/memberlist.php?mode=viewprofile&u=150&sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_user_profile.gif" height="13" alt="Xem thông tin cá nhân" title="Xem thông tin cá nhân"></a> 
			</td>
    	
		</tr>
	
	<tr>
		<td class="spacer" colspan="2" height="1"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" alt="" width="1" height="1"></td>
	</tr>
	<tr class="row1">

			<td align="center" valign="top" class="row">
				<a name="p36047"></a>
				<div class="postauthor" style="color: #2981B4">anhhd</div>
				

				<div class="postdetails">
					<br><b>Ngày tham gia:</b> T.Tư Tháng 7 22, 2009 4:41 pm<br><b>Bài viết:</b> 85<br><strong>Thanks:</strong>0 lần
					<br><b>Thanked:</b> 0 lần trong 0 post
					
				</div>
				<img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" width="120" height="1" alt="">
			</td>
			<td width="100%" height="25" class="row" valign="top">
				<div style="float: right;"><a style="text-decoration:none;" id="thanksimg36047" href="http://www.08hc.com/4rum/thanks.php?p=36047&mode=thanks&sid=35e863f12de61c3900a72eee590ee439" onclick="thankspost(&#39;./thanks.php?p=36047&amp;mode=thanks&amp;sid=35e863f12de61c3900a72eee590ee439&#39;,36047,575,1); return false;"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/thankposts.gif" alt="Thanks">&nbsp;&nbsp;</a></div>
				<div class="postsubject"><a href="http://www.08hc.com/4rum/viewtopic.php?p=36047&sid=35e863f12de61c3900a72eee590ee439#p36047"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_topic_latest.gif" width="13" height="9" alt="Gửi bài" title="Gửi bài"></a>&nbsp;Re: [Swing] - Xây dựng giao diện bằng Swing</div>

					

						<div class="postbody">Thank Long, Tam.<br><br>Đọc 1 lần hiểu chết liền. Cái này chắc phải đọc 10 lần nữa mới hỉu, co khi vừa đọc vừa ghi băng sau phát nghe lại cũng nên.</div>

					<br clear="all"><br>
					<div style="float:right">
						
					<!-- Mod_Share_On by JesusADS --><!-- Mod_Share_On -->
					</div>
			</td>
		</tr>

		<tr class="row1">

			<td class="postbottom" align="center">T.Năm Tháng 9 16, 2010 11:31 pm</td>
			<td class="postbottom postbuttons" valign="middle">
				
					<div style="float: right">
					
					</div>
				<a href="http://www.08hc.com/4rum/memberlist.php?mode=viewprofile&u=575&sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_user_profile.gif" height="13" alt="Xem thông tin cá nhân" title="Xem thông tin cá nhân"></a> 
			</td>
    	
		</tr>
	
	<tr>
		<td class="spacer" colspan="2" height="1"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" alt="" width="1" height="1"></td>
	</tr>
	<tr class="row2">

			<td align="center" valign="top" class="row">
				<a name="p36048"></a>
				<div class="postauthor" style="color: #2981B4">CaMapDen</div>
				

				<div class="postdetails">
					<br><b>Ngày tham gia:</b> T.Tư Tháng 11 18, 2009 11:21 am<br><b>Bài viết:</b> 384<br><strong>Thanks:</strong>1 lần
					<br><b>Thanked:</b> 1 lần trong 1 post
					
				</div>
				<img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/spacer.gif" width="120" height="1" alt="">
			</td>
			<td width="100%" height="25" class="row" valign="top">
				<div style="float: right;"><a style="text-decoration:none;" id="thanksimg36048" href="http://www.08hc.com/4rum/thanks.php?p=36048&mode=thanks&sid=35e863f12de61c3900a72eee590ee439" onclick="thankspost(&#39;./thanks.php?p=36048&amp;mode=thanks&amp;sid=35e863f12de61c3900a72eee590ee439&#39;,36048,823,1); return false;"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/thankposts.gif" alt="Thanks">&nbsp;&nbsp;</a></div>
				<div class="postsubject"><a href="http://www.08hc.com/4rum/viewtopic.php?p=36048&sid=35e863f12de61c3900a72eee590ee439#p36048"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_topic_latest.gif" width="13" height="9" alt="Gửi bài" title="Gửi bài"></a>&nbsp;Re: [Swing] - Xây dựng giao diện bằng Swing</div>

					

						<div class="postbody">sao viết store trong my sql cứ dính lỗi hoài thế huhu<br>hok bít làm rì nên tội tình này chứ</div>

					
						<span class="postbody signature"><br><span class="line">_________________</span><br><span style="color: #FF0000">I am cazry fan of Naruto</span></span>
					<br clear="all"><br>
					<div style="float:right">
						
					<!-- Mod_Share_On by JesusADS --><!-- Mod_Share_On -->
					</div>
			</td>
		</tr>

		<tr class="row2">

			<td class="postbottom" align="center">T.Sáu Tháng 9 17, 2010 11:15 am</td>
			<td class="postbottom postbuttons" valign="middle">
				
					<div style="float: right">
					
					</div>
				<a href="http://www.08hc.com/4rum/memberlist.php?mode=viewprofile&u=823&sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/icon_user_profile.gif" height="13" alt="Xem thông tin cá nhân" title="Xem thông tin cá nhân"></a> 
			</td>
    	
		</tr>
	
	<tr>
		<td class="cat" colspan="2" align="center"><form name="viewtopic" method="post" action="http://www.08hc.com/4rum/viewtopic.php?f=109&t=2372&start=0&sid=35e863f12de61c3900a72eee590ee439"><span class="gensmall">Hiển thị bài viết cách đây:</span> <select name="st" id="st"><option value="0" selected="selected">Tất cả bài viết</option><option value="1">1 ngày</option><option value="7">7 ngày</option><option value="14">2 tuần</option><option value="30">1 tháng</option><option value="90">3 tháng</option><option value="180">6 tháng</option><option value="365">1 năm</option></select>&nbsp;<span class="gensmall">Sắp xếp theo</span> <select name="sk" id="sk"><option value="a">Người gửi</option><option value="t" selected="selected">Ngày gửi</option><option value="s">Tiêu đề</option></select> <select name="sd" id="sd"><option value="a" selected="selected">Tăng dần</option><option value="d">Giảm dần</option></select>&nbsp;<input class="btnlite" type="submit" value="Chuyển" name="sort"></form></td>
	</tr>
	
	</tbody></table>
	
	<div class="block-end-left"><div class="block-end-right"></div></div></div>

	<table width="100%" cellspacing="1">
	<tbody><tr>
		
			<td align="left" valign="middle" nowrap="nowrap">
				<a href="http://www.08hc.com/4rum/posting.php?mode=reply&f=109&t=2372&sid=35e863f12de61c3900a72eee590ee439"><img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/button_topic_reply.gif" height="22" alt="Gửi bài trả lời" title="Gửi bài trả lời"></a>&nbsp;
			</td>
		
			<td class="nav" valign="middle" nowrap="nowrap">&nbsp;Trang <strong>1</strong> trên <strong>1</strong><br></td>
			<td class="gensmall" nowrap="nowrap">&nbsp;[ 4 bài viết ]&nbsp;</td>
			<td class="gensmall" width="100%" align="right" nowrap="nowrap"></td>
		
	</tr>
	</tbody></table>

</div>


<div id="pagefooter"></div>

<table class="tablebg breadcrumb" width="100%" cellspacing="0" cellpadding="0" style="margin-top: 5px;">
	<tbody><tr>
		<td class="row1">
			<p class="breadcrumbs"><a href="http://www.08hc.com/4rum/index.php?sid=35e863f12de61c3900a72eee590ee439">Trang chủ</a> » <a href="http://www.08hc.com/4rum/viewforum.php?f=6&sid=35e863f12de61c3900a72eee590ee439">Góc Học Tập</a> » <a href="http://www.08hc.com/4rum/viewforum.php?f=109&sid=35e863f12de61c3900a72eee590ee439">Chuyên Đề Java</a></p>
			<p class="datetime">Múi giờ UTC + 7 Giờ </p>
		</td>
	</tr>
	</tbody></table>
	<br clear="all">

	<table class="tablebg" width="100%" cellspacing="0">
	<tbody><tr>
		<td class="cat"><h4>Đang trực tuyến</h4></td>
	</tr>
	<tr>
		<td class="row1"><p class="gensmall">Đang xem chuyên mục này: <strong>Không có thành viên nào trực tuyến.</strong> và <strong>0</strong> khách.</p></td>
	</tr>
	</tbody></table>


<br clear="all">

<table width="100%" cellspacing="1">
<tbody><tr>
	<td width="40%" valign="top" nowrap="nowrap" align="left"></td>
	<td align="right" valign="top" nowrap="nowrap"><span class="gensmall">Bạn <strong>không thể</strong> tạo chủ đề mới.<br>Bạn <strong>không thể</strong> trả lời bài viết.<br>Bạn <strong>không thể</strong> sửa những bài viết của mình.<br>Bạn <strong>không thể</strong> xóa những bài viết của mình.<br>Bạn <strong>không thể</strong> gửi tập tin đính kèm.<br></span></td>
</tr>
</tbody></table>

<br clear="all">

<table width="100%" cellspacing="0">
<tbody><tr>
	<td><form method="post" name="search" action="http://www.08hc.com/4rum/search.php?t=2372&sid=35e863f12de61c3900a72eee590ee439"><span class="gensmall">Tìm với từ khóa:</span> <input class="post" type="text" name="keywords" size="20"> <input class="btnlite" type="submit" value="Chuyển"></form></td>
	<td align="right">
	<form method="post" name="jumpbox" action="http://www.08hc.com/4rum/viewforum.php?sid=35e863f12de61c3900a72eee590ee439" onsubmit="if(document.jumpbox.f.value == -1){return false;}">

	<table cellspacing="0" cellpadding="0" border="0">
	<tbody><tr>
		<td nowrap="nowrap"><span class="gensmall">Chuyển đến:</span>&nbsp;<select name="f" onchange="if(this.options[this.selectedIndex].value != -1){ document.forms[&#39;jumpbox&#39;].submit() }">

		
			<option value="-1">Chọn chuyên mục</option>
		<option value="-1">------------------</option>
			<option value="1">Thông Báo</option>
		
			<option value="93">&nbsp; &nbsp;Tự Hào Việt Nam</option>
		
			<option value="2">&nbsp; &nbsp;Thông Báo Từ BQT</option>
		
			<option value="19">&nbsp; &nbsp;Thông Báo Từ BCS</option>
		
			<option value="83">&nbsp; &nbsp;Thông Báo Từ BCH Chi Đoàn</option>
		
			<option value="20">&nbsp; &nbsp;Ý Kiến - Đóng Góp</option>
		
			<option value="35">Những điều cần biết</option>
		
			<option value="36">&nbsp; &nbsp;Lập Trình</option>
		
			<option value="73">&nbsp; &nbsp;Đồ Họa</option>
		
			<option value="74">&nbsp; &nbsp;&nbsp; &nbsp;Corel</option>
		
			<option value="75">&nbsp; &nbsp;&nbsp; &nbsp;Photoshop</option>
		
			<option value="37">&nbsp; &nbsp;Thủ Thuật Internet</option>
		
			<option value="46">&nbsp; &nbsp;&nbsp; &nbsp;Phần mềm</option>
		
			<option value="47">&nbsp; &nbsp;&nbsp; &nbsp;Phần Cứng</option>
		
			<option value="48">&nbsp; &nbsp;&nbsp; &nbsp;Thủ thuật lướt NET</option>
		
			<option value="49">&nbsp; &nbsp;&nbsp; &nbsp;Hỏi đáp tin học</option>
		
			<option value="50">&nbsp; &nbsp;Tài Liệu</option>
		
			<option value="52">&nbsp; &nbsp;&nbsp; &nbsp;Chương Trình Học</option>
		
			<option value="53">&nbsp; &nbsp;&nbsp; &nbsp;Tiếng Anh</option>
		
			<option value="54">&nbsp; &nbsp;&nbsp; &nbsp;Tiếng Việt</option>
		
			<option value="55">&nbsp; &nbsp;&nbsp; &nbsp;Tài Liệu Khác</option>
		
			<option value="27">Công việc - Thị Trường</option>
		
			<option value="66">&nbsp; &nbsp;Tin Tức Công Nghệ</option>
		
			<option value="29">&nbsp; &nbsp;Thông tin tuyển dụng</option>
		
			<option value="112">&nbsp; &nbsp;&nbsp; &nbsp;Tư vấn nghề nghiệp</option>
		
			<option value="113">&nbsp; &nbsp;&nbsp; &nbsp;Tin tuyển dụng</option>
		
			<option value="28">&nbsp; &nbsp;Đồ điện, điện tử, công nghệ thông tin</option>
		
			<option value="72">&nbsp; &nbsp;Rao vặt</option>
		
			<option value="6">Góc Học Tập</option>
		
			<option value="109" selected="selected">&nbsp; &nbsp;Chuyên Đề Java</option>
		
			<option value="110">&nbsp; &nbsp;NN LT HĐ</option>
		
			<option value="111">&nbsp; &nbsp;CSDL Web</option>
		
			<option value="77">&nbsp; &nbsp;HK I</option>
		
			<option value="60">&nbsp; &nbsp;&nbsp; &nbsp;LTĐT  (Thầy:Nguyễn Thanh Sơn)</option>
		
			<option value="17">&nbsp; &nbsp;&nbsp; &nbsp;LTĐT (Thầy:Đinh Bá Tiến)</option>
		
			<option value="40">&nbsp; &nbsp;&nbsp; &nbsp;Tâm Lý Học ( Thầy:Nguyễn Trí Trung )</option>
		
			<option value="18">&nbsp; &nbsp;&nbsp; &nbsp;NM-CNPM (Thầy:Nguyễn Tấn Trần Minh Khang)</option>
		
			<option value="16">&nbsp; &nbsp;&nbsp; &nbsp;Lý A3 (Thầy:Châu Văn Tạo)</option>
		
			<option value="15">&nbsp; &nbsp;&nbsp; &nbsp;Toán A2 (Thầy: Nguyễn Viêm)</option>
		
			<option value="94">&nbsp; &nbsp;HK II</option>
		
			<option value="78">&nbsp; &nbsp;&nbsp; &nbsp;Hệ QT CSDL</option>
		
			<option value="85">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Lý Thuyết</option>
		
			<option value="84">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Thực Hành</option>
		
			<option value="79">&nbsp; &nbsp;&nbsp; &nbsp;Datamining</option>
		
			<option value="81">&nbsp; &nbsp;&nbsp; &nbsp;Quản Lý Đề Án Phần Mềm</option>
		
			<option value="86">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Lý Thuyết</option>
		
			<option value="87">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Thực Hành</option>
		
			<option value="90">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nơi đăng các thông báo tuyển dụng</option>
		
			<option value="91">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nơi đăng các thông tin người tìm việc</option>
		
			<option value="80">&nbsp; &nbsp;&nbsp; &nbsp;Công Cụ &amp; MT PT Phần Mềm</option>
		
			<option value="88">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Lý Thuyết</option>
		
			<option value="89">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Thực Hành</option>
		
			<option value="101">&nbsp; &nbsp;HK III</option>
		
			<option value="95">&nbsp; &nbsp;&nbsp; &nbsp;HĐH Linux</option>
		
			<option value="96">&nbsp; &nbsp;&nbsp; &nbsp;Cấu Trúc Dữ Liệu 2</option>
		
			<option value="97">&nbsp; &nbsp;&nbsp; &nbsp;XD PM HĐH</option>
		
			<option value="98">&nbsp; &nbsp;&nbsp; &nbsp;PT TKHTTT</option>
		
			<option value="108">&nbsp; &nbsp;HK IV</option>
		
			<option value="99">&nbsp; &nbsp;&nbsp; &nbsp;TMĐT</option>
		
			<option value="102">&nbsp; &nbsp;&nbsp; &nbsp;NM KCPM(ST)</option>
		
			<option value="103">&nbsp; &nbsp;&nbsp; &nbsp;CS THVT</option>
		
			<option value="82">&nbsp; &nbsp;&nbsp; &nbsp;Anh Văn</option>
		
			<option value="100">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;08HCB Club</option>
		
			<option value="3">Không Gian Trống</option>
		
			<option value="4">&nbsp; &nbsp;Trao Đổi - Thảo Luận Chung</option>
		
			<option value="21">&nbsp; &nbsp;Giải Trí - Thư Giãn</option>
		
			<option value="22">&nbsp; &nbsp;&nbsp; &nbsp;Nhạc</option>
		
			<option value="23">&nbsp; &nbsp;&nbsp; &nbsp;Truyện Cười</option>
		
			<option value="24">&nbsp; &nbsp;&nbsp; &nbsp;Thơ - Văn</option>
		
			<option value="26">&nbsp; &nbsp;&nbsp; &nbsp;Game</option>
		
			<option value="42">&nbsp; &nbsp;&nbsp; &nbsp;Radio Online</option>
		
			<option value="58">&nbsp; &nbsp;&nbsp; &nbsp;Đố Vui</option>
		
			<option value="67">&nbsp; &nbsp;&nbsp; &nbsp;Clip vui</option>
		
			<option value="68">&nbsp; &nbsp;&nbsp; &nbsp;Hình Quái Dị</option>
		
			<option value="43">&nbsp; &nbsp;Địa Chỉ Hay Đến</option>
		
			<option value="44">&nbsp; &nbsp;&nbsp; &nbsp;Quán Ăn Bình Dân</option>
		
			<option value="45">&nbsp; &nbsp;&nbsp; &nbsp;Khu vui chơi giải trí</option>
		
			<option value="56">&nbsp; &nbsp;Giới Thiệu &amp; Làm Quen</option>
		
			<option value="57">&nbsp; &nbsp;Tâm</option>
		
			<option value="65">&nbsp; &nbsp;Lời Hay - Ý Đẹp</option>
		
			<option value="30">Góc Sinh Viên</option>
		
			<option value="59">&nbsp; &nbsp;Hoạt Động Chung</option>
		
			<option value="63">&nbsp; &nbsp;Hình Ảnh Hoạt Động</option>
		
			<option value="61">&nbsp; &nbsp;Nhóm Học Tập</option>
		
			<option value="62">&nbsp; &nbsp;&nbsp; &nbsp;TASS</option>
		
			<option value="64">&nbsp; &nbsp;&nbsp; &nbsp;Học Nhóm</option>
		
			<option value="34">&nbsp; &nbsp;Phòng tám</option>
		
			<option value="69">&nbsp; &nbsp;CLB Thể Thao</option>
		
			<option value="70">&nbsp; &nbsp;&nbsp; &nbsp;Bóng Đá</option>
		
			<option value="104">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;MU FC</option>
		
			<option value="105">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Arsenal FC</option>
		
			<option value="106">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Chelsea FC</option>
		
			<option value="107">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Liverpool FC</option>
		
			<option value="71">&nbsp; &nbsp;&nbsp; &nbsp;Cầu Lông</option>
		
			<option value="76">&nbsp; &nbsp;Sinh Nhật Thành Viên</option>
		
			<option value="92">&nbsp; &nbsp;Thành Viên Viết</option>
		

		</select>&nbsp;<input class="btnlite" type="submit" value="Chuyển"></td>
	</tr>
	</tbody></table>

	</form>
</td>
</tr>
</tbody></table>

<img src="./08HC - Xem chủ đề - [Swing] - Xây dựng giao diện bằng Swing_files/cron.php" width="1" height="1" alt="cron">

<div id="wrapfooter">
	
	<span class="copyright">
	Powered by <a href="http://www.phpbb.com/">phpBB</a> © 2000, 2002, 2005, 2007 phpBB Group.
	<br> Designed by <a href="http://stsoftware.biz/">STSoftware</a> for <a href="http://ptf.com/">PTF</a>.
	<br>Vietnamese translation by <a href="http://www.vinabb.com/">nedka</a></span>
</div>

	</center></td>
</tr>
</tbody></table>

</div>

</body><span id="skype_highlighting_settings" display="none" autoextractnumbers="1"></span><object id="skype_plugin_object" location.href="http://www.08hc.com/4rum/viewtopic.php?f=76&amp;p=35927" location.hostname="www.08hc.com" style="position: absolute; visibility: hidden; left: -100px; top: -100px; " width="0" height="0" type="application/x-vnd.skype.toolbars.npplugin.4.2.0"></object></html>